package edu.uoc.vmerinom.tfc.service;

import java.util.Date;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.Transactional;
import org.jboss.seam.log.Log;

import edu.uoc.vmerinom.tfc.domain.Solicitud;

/**
 * Clase de servicios con las operaciones de acceso a base de datos para el
 * módulo de solicitudes.
 * 
 * @author Víctor Manuel Merino Martínez
 * 
 */
@Name("solicitudesService")
@Scope(ScopeType.CONVERSATION)
public class SolicitudesService {
	/**
	 * Gestor de entidades.
	 */
	@In(create = true)
	EntityManager entityManager;

	/**
	 * Log para la trazabilidad de errores.
	 */
	@Logger
	Log log;

	/**
	 * Devuelve una solicitud cuya referencia coincida con la que recibe por
	 * parámetros.
	 * 
	 * @param referencia
	 *            Código de referencia de la solicitud
	 * @return Solicitud encontrada. <code>null</code> en caso contrario.
	 */
	public Solicitud obtenerSolicitud(String referencia) {
		if (log.isDebugEnabled()) {
			log.debug("SolicitudesService.obtenerSolicitud(referencia:" + referencia + ")");
		}
		final String query = "from Solicitud s where s.referencia like :referencia";
		log.info(query);
		Solicitud solicitud = null;
		try {
			solicitud = (Solicitud) entityManager.createQuery(query).setParameter("referencia", referencia).getSingleResult();
		} catch (NoResultException e) {
			solicitud = null;
		}
		return solicitud;
	}

	/**
	 * Devuelve un listado de solicitudes ordenadas por fecha de entrada y tipo
	 * aceptada.
	 * 
	 * @return Listado de solicitudes ordenadas
	 */
	@SuppressWarnings("unchecked")
	public List<Solicitud> obtenerSolicitudes() {
		if (log.isDebugEnabled()) {
			log.debug("SolicitudesService.obtenerSolicitud()");
		}
		final String query = "from Solicitud s order by s.fechaEntrada, s.aceptada desc";
		log.info(query);
		return entityManager.createQuery(query).getResultList();
	}

	/**
	 * Inserta o modifica los datos de la solicitud que recibe por parámetros.
	 * 
	 * @param solicitud
	 *            Solicitud a insertar/modificar
	 */
	@Transactional
	public void insertarModificarSolicitud(Solicitud solicitud) {
		if (log.isDebugEnabled()) {
			log.debug("SolicitudesService.insertarModificarSolicitud(solicitud:" + solicitud + ")");
		}
		if (solicitud != null) {
			final Date hoy = new Date(System.currentTimeMillis());
			if (solicitud.getId() == null) {
				solicitud.setCreado(hoy);
			}
			solicitud.setModificado(hoy);
			entityManager.persist(solicitud);
		}
		entityManager.flush();
	}
}
